var _adHandler_version = "v1.0.0";

// 添加对adDetector的引用
var adDetector = (typeof global !== 'undefined' && global.adDetector) ? global.adDetector : 
               (typeof window !== 'undefined' && window.adDetector) ? window.adDetector : 
               (typeof adDetector !== 'undefined') ? adDetector : null;

var adHandler = {
    // 添加init方法
    init: function() {
        // 初始化日志
        if (typeof Logger.debug === 'function') {
            Logger.debug("广告处理模块", "广告处理模块初始化完成");
        }
        return true;
    },
    
    handleAdByType :function (adInfo, gameConfig) {
        var module = "广告处理调度";
        var adType = adInfo.adType;
        if (gameConfig) {
            // Logger.debug(module, "gameConfig基本信息: {名称: " + (gameConfig.名称 || "无") + ", 包名: " + (gameConfig.包名 || "无") + "}");
        }
        // 优先从全局变量获取，其次从globalState中获取
        // var handlerMap = (typeof global !== 'undefined' && global.adHandlerMap) ? global.adHandlerMap : 
        //                 (typeof window !== 'undefined' && window && window.adHandlerMap) ? window.adHandlerMap : 
        //                 (typeof adHandlerMap !== 'undefined') ? adHandlerMap : 
        //                 (typeof StateManager !== 'undefined' && StateManager.getModule) ? StateManager.getModule('adHandlerMap') : null;
        // Logger.debug(module, "使用的handlerMap来源: " + (handlerMap === adHandlerMap ? "全局变量" : "globalState"));
        // 直接使用当前文件中定义的adHandlerMap
        var handlerMap = adHandlerMap;
        var handler = handlerMap[adType];
        if (!handler) {
            Logger.debug(module, "未找到「" + adType + "」处理函数");
            return false;
        }
        try {
            var result = handler(adInfo, gameConfig);
            // Logger.debug(module, "「" + adType + "」处理函数返回结果: " + result);
            return result;
        } catch (e) {
            Logger.debug(module, "处理「" + adType + "」出错：" + e.message);
            Logger.debug(module, "错误堆栈: " + e.stack);
            return false;
        }
    },
    
    // 广告处理实现 - 使用检测到的广告信息
    processAd: function(context) {
        context = context || {};
        var module = "广告处理";
        try {
            // 直接从全局变量获取检测到的广告信息以提高性能
            var detectedAdInfo = (typeof global !== 'undefined' && global.detectedAdInfo) ? global.detectedAdInfo : 
                                (typeof window !== 'undefined' && window && window.detectedAdInfo) ? window.detectedAdInfo : 
                                (typeof detectedAdInfo !== 'undefined') ? detectedAdInfo : 
                                (typeof StateManager !== 'undefined' && StateManager.getDetectedAdInfo) ? StateManager.getDetectedAdInfo() : null;
            if (!detectedAdInfo) {
                Logger.debug(module, "没有检测到广告信息，无法处理");
                return;
            }

            var adItem = detectedAdInfo.adItem;
            var adObj = detectedAdInfo.adObj;
            var adType = detectedAdInfo.type;
            
            Logger.debug(module, "开始处理广告 - 类型：" + adType + ", 描述：" + (adItem.desc || "无描述"));
            
            var adInfo = {
                adType: adType,
                adConfig: adItem,
                adObj: adObj
            };
            
            // 直接从全局变量获取相关状态以提高性能
            var selectedGames = (typeof global !== 'undefined' && global.selectedGames) ? global.selectedGames : 
                               (typeof window !== 'undefined' && window && window.selectedGames) ? window.selectedGames : 
                               (typeof selectedGames !== 'undefined') ? selectedGames : 
                               (typeof StateManager !== 'undefined' && StateManager.getSelectedGames) ? StateManager.getSelectedGames() : [];
            var runConfig = (typeof global !== 'undefined' && global.runConfig) ? global.runConfig : 
                           (typeof window !== 'undefined' && window && window.runConfig) ? window.runConfig : 
                           (typeof runConfig !== 'undefined') ? runConfig : 
                           (typeof StateManager !== 'undefined' && StateManager.getRunConfig) ? StateManager.getRunConfig() : {};
            var globalAdState = (typeof global !== 'undefined' && global.globalAdState) ? global.globalAdState : 
                               (typeof window !== 'undefined' && window && window.globalAdState) ? window.globalAdState : 
                               (typeof globalAdState !== 'undefined') ? globalAdState : 
                               (typeof StateManager !== 'undefined' && StateManager.getGlobalAdState) ? StateManager.getGlobalAdState() : {};
            
            // 从全局状态中获取当前游戏配置（简化实现）
            var currentGameConfig = null;
            if (selectedGames && selectedGames.length > 0) {
                // 假设当前运行的是第一个游戏（实际应该有更准确的方式获取当前活动游戏）
                currentGameConfig = selectedGames[0];
            }
            
            // var handledAdTypes = [];
            
            // // 如果有游戏配置，获取该游戏的去重状态
            // if (currentGameConfig && currentGameConfig.名称 && globalAdState) {
            //     var gameName = currentGameConfig.名称;
            //     if (!globalAdState[gameName]) {
            //         globalAdState[gameName] = { handledAdTypes: [] };
            //     }
            //     handledAdTypes = globalAdState[gameName].handledAdTypes || [];
            // }
            
            // 调用handleAdByType函数处理广告，如果没有游戏配置则只使用广告信息
            var handleResult = false;
            if (typeof adHandler.handleAdByType === 'function') {
                try {
                    if (currentGameConfig) {
                        handleResult = adHandler.handleAdByType(adInfo, currentGameConfig);
                    } else {
                        // 没有游戏配置时，只传递广告信息
                        handleResult = adHandler.handleAdByType(adInfo);
                        Logger.debug(module, "警告：处理广告时未找到游戏配置");
                    }
                } catch (handleError) {
                    Logger.debug(module, "handleAdByType调用异常：" + handleError.message);
                }
            }
            
            if (handleResult) {
                Logger.debug(module, "广告处理成功");
            } else {
                // 如果handleAdByType处理失败，回退到原有逻辑
                Logger.debug(module, "handleAdByType处理失败，使用配置坐标执行点击：" + adItem.bounds.toString());
                var centerX = (adItem.bounds[0] + adItem.bounds[2]) / 2;
                var centerY = (adItem.bounds[1] + adItem.bounds[3]) / 2;
                
                try {
                    // 执行点击操作
                    click(centerX, centerY);
                    Logger.debug(module, "已点击中心点坐标：" + centerX + "," + centerY);
                } catch (clickError) {
                    Logger.debug(module, "点击坐标异常：" + clickError.message);
                }
            }
            
            // 处理完成后清除广告信息
            if (typeof StateManager !== 'undefined' && typeof StateManager.set === 'function') {
                StateManager.set("detectedAdInfo", null);
            } else if (typeof global !== 'undefined') {
                global.detectedAdInfo = null;
            } else if (typeof window !== 'undefined' && window) {
                window.detectedAdInfo = null;
            }
            // Logger.debug(module, "广告处理完成");
        } catch (e) {
            Logger.debug(module, "广告处理异常：" + e.message);
            // 发生异常时也清除广告信息，避免影响下次检测
            if (typeof StateManager !== 'undefined' && typeof StateManager.set === 'function') {
                StateManager.set("detectedAdInfo", null);
            } else if (typeof global !== 'undefined') {
                global.detectedAdInfo = null;
            } else if (typeof window !== 'undefined' && window) {
                window.detectedAdInfo = null;
            }
            throw e; // 重新抛出异常，以便上层函数处理
        }
    } 
};

// 创建adHandlerMap对象
var adHandlerMap = {
    // 插屏控件处理函数
    "插屏控件": function(adInfo, gameConfig) {
        var module = "广告处理-插屏控件";
        if (adInfo.adConfig.type !== "插屏控件") {
            Logger.debug(module, "类型不匹配，跳过");
            return false;
        }
        var adObj = adInfo.adObj;
        var adConfig = adInfo.adConfig;
        Logger.debug(module, "处理「" + adConfig.desc + "」（100%执行）");
        
        // 使用辅助函数获取边界
        var rect = getAdBoundsSafely(adObj, adConfig, module);
        if (!rect) {
            return false;
        }
        randomSleep(500, 800);
                
        // 根据描述执行不同处理逻辑 
        if (adConfig.desc.indexOf("残忍离开003") > -1) {
            humanClick(rect.centerX(), rect.centerY() - 160);
            Logger.debug(module, "残忍离开等待");
            randomSleep(adConfig.sleepTime || 2000);
        } else if (adConfig.desc.indexOf("仅此一次") > -1) {
            back();
            Logger.debug(module, "仅此一次处理");
            randomSleep(adConfig.sleepTime || 2000);
        } else if (adConfig.desc.indexOf("B999") > -1) {
            humanClick(940,359);  // 右上X
            randomSleep(adConfig.sleepTime || 1200);
        } else {
            humanClick(rect.centerX(), rect.centerY());
            randomSleep(adConfig.sleepTime || 1200);
        }

        randomSleep(adConfig.sleepTime || 3000);
        return true;
    },
    // 弹窗控件处理（复用插屏控件逻辑）
    "弹窗控件": function(adInfo, gameConfig) {
        return adHandlerMap["插屏控件"](adInfo, gameConfig);
    },
    // 关返控件处理函数
    "关闭控件": function(adInfo, gameConfig) {
        var module = "广告处理-关闭控件";
        if (adInfo.adConfig.type !== "关闭控件") {
            Logger.debug(module, "类型不匹配，跳过");
            return false;
        }
        
        var adObj = adInfo.adObj;
        var adConfig = adInfo.adConfig;
        var runConfig = getRunConfig();
        
        Logger.debug(module, "处理「" + adConfig.desc + "」（100%执行）");
        
        // 使用辅助函数获取边界
        var rect = getAdBoundsSafely(adObj, adConfig, module);
        if (!rect) {
            return false;
        }
        
        randomSleep(500, 800);
        // 使用humanClick替代click以提高点击成功率
        humanClick(rect.centerX(), rect.centerY());

        // 增加延迟时间确保广告完全关闭
        randomSleep(adConfig.sleepTime || 2000);
        return true;
    },
    // 关返控件处理函数
    "返回控件": function(adInfo, gameConfig) {
        var module = "广告处理-返回控件";
        if (adInfo.adConfig.type !== "返回控件") {
            Logger.debug(module, "类型不匹配，跳过");
            return false;
        }
        
        var adObj = adInfo.adObj;
        var adConfig = adInfo.adConfig;
        var runConfig = getRunConfig();
        
        Logger.debug(module, "处理「" + adConfig.desc + "」（100%执行）");
        
        // 使用辅助函数获取边界
        var rect = getAdBoundsSafely(adObj, adConfig, module);
        if (!rect) {
            return false;
        }
        
        randomSleep(500, 800);
        humanClick(rect.centerX(), rect.centerY());
        randomSleep(800, 1200);
        // 关返控件统一检查是否需要点击残忍离开----广告配置中取消残忍离开
        var result = adDetector.detectTextsAd("残忍离开", 'exact',[0, 1000, 600,, 1500]);
        if (result.detected) {
            // 获取控件坐标
            var control = result.control;
            var rect = control.bounds();
            // 手动计算中心点坐标，确保兼容性
            var centerX = (rect.left + rect.right) / 2;
            var centerY = (rect.top + rect.bottom) / 2;
            humanClick(centerX, centerY); // 残忍离开
        }
        
        randomSleep(adConfig.sleepTime || 300);
        return true;
    },
    // 标记控件处理函数
    "标记控件": function(adInfo, gameConfig) {
        var module = "广告处理-标记控件";
        
        // 添加参数验证
        if (!adInfo || !adInfo.adConfig) {
            Logger.debug(module, "广告信息无效，跳过");
            return false;
        }
        
        // 输出详细日志
        // Logger.debug(module, "广告配置信息: {desc: " + adInfo.adConfig.desc + ", type: " + adInfo.adConfig.type + ", bounds: " + (adInfo.adConfig.bounds ? adInfo.adConfig.bounds.toString() : "无") + "}");
        // Logger.debug(module, "广告对象存在性: " + (adInfo.adObj ? "存在" : "不存在"));
        
        if (adInfo.adConfig.type !== "标记控件") {
            Logger.debug(module, "类型不匹配，跳过");
            return false;
        }
        
        var adObj = adInfo.adObj;
        var adConfig = adInfo.adConfig;
        Logger.debug(module, "处理「" + adConfig.desc + "」（100%执行）");
        
        // 使用辅助函数获取边界
        var rect = getAdBoundsSafely(adObj, adConfig, module);
        // Logger.debug(module, "获取边界信息: " + (rect ? "成功" : "失败"));
        
        sleep(adConfig.sleepTime || 600);  
        randomSleep(300, 600);  
        
        // Logger.debug(module, "标记控件处理完成，返回true");
        return true;
    },
    // 跳转控件处理函数
    "跳转控件": function(adInfo, gameConfig) {
        var module = "广告处理-跳转控件";
        if (adInfo.adConfig.type !== "跳转控件") {
            Logger.debug(module, "类型不匹配，跳过");
            return false;
        }
        
        var adObj = adInfo.adObj;
        var adConfig = adInfo.adConfig;
        var runConfig = getRunConfig();
    
        randomSleep(300, 500);
        
        // 使用辅助函数获取边界
        var rect = getAdBoundsSafely(adObj, adConfig, module);
        if (!rect) {
            return false;
        }
        randomSleep(500, 800);
        humanClick(rect.centerX(), rect.centerY());
        randomSleep(adConfig.sleepTime || 20000);
        return true;
    },
    // 下载控件处理函数
    "安装控件": function(adInfo, gameConfig) {
        var module = "广告处理-安装控件";
        if (adInfo.adConfig.type !== "安装控件") {
            Logger.debug(module, "类型不匹配，跳过");
            return false;
        }  
        var adObj = adInfo.adObj;
        var adConfig = adInfo.adConfig;
        var runConfig = getRunConfig();
        
        randomSleep(300, 500);
        // 使用辅助函数获取边界
        var rect = getAdBoundsSafely(adObj, adConfig, module);
        if (!rect) {
            return false;
        }

        // 如果没有特定的text处理策略，则根据描述执行原有逻辑 --- 坐标检测类的控件
        // 从广告配置中获取概率值，如果没有设置则使用默认值0.7
        var probability = adConfig.概率 || adConfig.probability || 1.0;
        if (adConfig.desc.indexOf("允许") > -1) {
            installApp();
            // 使用封装的概率点击函数
            // if (!probabilityClick(rect.centerX(), rect.centerY(), probability)) {
            //     if (typeof installApp === 'function') {
            //         installApp();
            //     }                 
            // }
        }else{
            humanClick(rect.centerX(), rect.centerY());
            randomSleep(adConfig.sleepTime || 2000);
        }
        randomSleep(800, 1200);
        return true;
    },
    // 滑屏控件处理函数
    "滑屏控件": function(adInfo, gameConfig) {
        var module = "广告处理-滑屏控件";
        if (adInfo.adConfig.type !== "滑屏控件") {
            Logger.debug(module, "类型不匹配，跳过");
            return false;
        }
        
        var adObj = adInfo.adObj;
        var adConfig = adInfo.adConfig;
        var runConfig = getRunConfig();
        
        // 使用辅助函数获取边界
        var rect = getAdBoundsSafely(adObj, adConfig, module);
        if (!rect) {
            return false;
        }
        randomSleep(200, 600);
        // 上滑操作
        humanSwipe(540, 1826, 540, 626, 200);
        sleep(adConfig.sleepTime || 3000);
        randomSleep(800, 1200);
        // 左箭头尝试退出
        humanClick(81, 178);
        
        randomSleep(800, 1200);
        return true;
    },
    "垃圾控件": function(adInfo, gameConfig) {
        var module = "广告处理-垃圾控件";
        if (adInfo.adConfig.type !== "垃圾控件") {
            Logger.debug(module, "类型不匹配，跳过");
            return false;
        }
        randomSleep(500, 800);
        // 调用closeApp函数（在main文件中实现）
        if (typeof closeApp === 'function') {
            closeApp();
        }  
        randomSleep(800, 1200);
        return true;
    }
};

// 导出模块
if (typeof module !== 'undefined' && module.exports) {
    module.exports = {
        adHandler: adHandler,
        adHandlerMap: adHandlerMap
    };
} else if (typeof window !== 'undefined' && window) {
    window.adHandler = adHandler;
    window.adHandlerMap = adHandlerMap;
} else if (typeof global !== 'undefined') {
    global.adHandler = adHandler;
    global.adHandlerMap = adHandlerMap;
}